

//写






#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <gmssl/sm2.h>  
#include <gmssl/sm3.h>  
#include <gmssl/error.h>  

// 辅助函数：以十六进制格式打印字节数组  
void print_hex(const char *label, const uint8_t *data, size_t len) {  
    printf("%s: ", label);  
    for(size_t i = 0; i < len; i++) {  
        printf("%02X", data[i]);  
    }  
    printf("\n");  
}  





int xieru_p(char *filename,SM2_KEY* temp_key)
{
	FILE *file;  
     
  
    // 打开文件以写入（如果文件不存在则创建它）  
    file = fopen(filename, "wb");  
    if (file == NULL) {  
        perror("Error opening file for writing");  
        return 1;  
    }  
  
  	fwrite(&(temp_key->public_key),sizeof(SM2_Z256_POINT), 1, file);

    // 写入字符串到文件  
    fclose(file); // 关闭文件 
    return 0;
}




int xieru_s(char *filename,SM2_KEY* temp_key)
{
	FILE *file;  
     
  
    // 打开文件以写入（如果文件不存在则创建它）  
    file = fopen(filename, "wb");  
    if (file == NULL) {  
        perror("Error opening file for writing");  
        return 1;  
    }  
  
  	fwrite(temp_key, sizeof(SM2_KEY), 1, file);

    // 写入字符串到文件  
    fclose(file); // 关闭文件 
    return 0;
}





int duqu_p(char *filename,SM2_KEY* mykey)
{
	FILE *file;  
     
   // 打开文件以读取  
    file = fopen(filename, "rb");  

    if (file == NULL) {  
        perror("Error opening file for writing");  
        return 1;  
    }  
  
	fread(&(mykey->public_key), sizeof(SM2_Z256_POINT), 1, file);

    // 写入字符串到文件  
    fclose(file); // 关闭文件 
    return 0;
}



int duqu_s(char *filename,SM2_KEY* mykey)
{
	FILE *file;  
     
   // 打开文件以读取  
    file = fopen(filename, "rb");  

    if (file == NULL) {  
        perror("Error opening file for writing");  
        return 1;  
    }  
	fread(mykey, sizeof(SM2_KEY), 1, file);

     
    fclose(file);  
    return 0;
}





    
int main(int argc, char *argv[]){
	if(argc<3){
	printf("no enough filename\n");
	return 0;
	}
	SM2_KEY mykey;
	sm2_key_generate(&mykey);
	
	sm2_key_print(stdout, 0, 4, "SM2 公钥", &mykey);
	
	
	
	xieru_s(argv[1],&mykey);
	xieru_p(argv[2],&mykey);


		
	return 0;
	
}    
